//5．编写一个函数，把一个unsigned short类型值中的所有位向左旋转指定数量的位。
//例如，rotate_l(x,4)把x中所有位向左移动4个位置，而且从最左端移出的位会重新出现在右端。
//也就是说，把高阶位移出的位放入低阶位。在一个程序中测试该函数。
#include <stdio.h>
#include <assert.h>

int rotate_l(unsigned int val, int len);

int main(void) {
    //0x1000,0001 : 0001 0000 0000 0000 0000 0000 0000 0001
    //<<4
    //0x11          0000 0000 0000 0000 0000 0000 0001 0001
    //0x1800,0001 : 0001 1000 0000 0000 0000 0000 0000 0001
    //<<5
    //0x23          0000 0000 0000 0000 0000 0000 0010 0011
    assert(rotate_l(0x10000001, 4) == 0x11);
    assert(rotate_l(0x18000001, 5) == 0x23);
    return 0;
}


int rotate_l(unsigned int val, int len) {
    int s_i = (int) sizeof(unsigned int)*8;
    //！！下面是答案上保持值有效的方法
    b %= size; /* keep b a valid value */
    //会移出的值通过右移保存
    unsigned int out = val >> (s_i - len);
    return val << len  | out;
}